Addgrad
逐元素计算加法梯度
\[\begin{split}dx1 = \frac{\partial L}{\partial X1} = \frac{\partial L}{\partial Y} * 1 = \frac{\partial L}{\partial Y}\\
dx2 = \frac{\partial L}{\partial X2} = \frac{\partial L}{\partial Y} * 1 = \frac{\partial L}{\partial Y}\end{split}\]
- 输入:
dy - dy数据地址。
dx1_dim - x1的维度信息。
dx2_dim - x2的维度信息。
dy_dims - dy的维度信息。
num_dims - 维度数
core_mask - 核掩码。
- 输出:
dx1 - dx1的数据地址。
dx2 - dx2的数据地址。
- 支持平台:
FT78NEMT7004
备注
FT78NE 支持fp32
MT7004 支持fp16, fp32
共享存储版本:
-
void fp_addgrad_s(float *dy, int *x1_dims, int *x2_dims, int *dy_dims, int num_dims, float *dx1, float *dx2, int core_mask)
-
void hp_addgrad_s(half *dy, int *x1_dims, int *x2_dims, int *dy_dims, int num_dims, half *dx1, half *dx2, int core_mask)
C调用示例:
1//FT78NE示例
2#include <stdio.h>
3#include <addgrad.h>
4
5int main(int argc, char* argv[]) {
6 float *dy = (float *)0xA0000000; //input在DDR空间
7 float *dx1 = (float *)0xB0000000; //dx1
8 float *dx2 = (float *)0xC0000000; //dxx
9 int dx1_dims[] = {13, 183, 47}; // 2x2
10 int dx2_dims[] = {1, 183, 47}; // 2x2
11 int dy_dims[] = {13, 183, 47}; // 2x2
12 int num_dims = 3;
13 int core_mask = 0xff;
14 fp_addgrad_s(dy, dx1_dims, dx2_dims, dy_dims, num_dims, dx1, dx2, core_mask);
15 return 0;
16}
私有存储版本:
-
void fp_addgrad_p(float *dy, int *x1_dims, int *x2_dims, int *dy_dims, int num_dims, float *dx1, float *dx2)
-
void hp_addgrad_p(half *dy, int *x1_dims, int *x2_dims, int *dy_dims, int num_dims, half *dx1, half *dx2)
C调用示例:
1//FT78NE示例
2#include <stdio.h>
3#include <addgrad.h>
4
5int main(int argc, char* argv[]) {
6 float *dy = (float *)0x10000000; //input在L2空间
7 float *dx1 = (float *)0x10001000; //dx1
8 float *dx2 = (float *)0x10002000; //dxx
9 int dx1_dims[] = {13, 183, 47}; // 2x2
10 int dx2_dims[] = {1, 183, 47}; // 2x2
11 int dy_dims[] = {13, 183, 47}; // 2x2
12 int num_dims = 3;
13 fp_addgrad_p(dy, dx1_dims, dx2_dims, dy_dims, num_dims, dx1, dx2);
14 return 0;
15}